package top.goldenyear.porpoise.framework.web.core.generator.model;

import cn.hutool.v7.core.collection.CollUtil;
import java.math.BigInteger;
import java.util.*;
import lombok.*;
import lombok.experimental.Accessors;

/**
 * 数据库表信息
 *
 * @author airhead
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class TableMeta {
  /** 表名 */
  private String name;

  /** schema（模式） */
  private String schema;

  /** 表注释 */
  private String comment;

  /** 主键 */
  private Set<String> primaryKeys;

  /** 所包含的列 */
  @Builder.Default private List<ColumnMeta> columnMetas = new ArrayList<>();

  public String getFirstPrimaryKey() {
    // 这里默认表中一定会有字段，就不做空判断了
    return columnMetas.stream()
        .filter(ColumnMeta::getPrimaryKey)
        .findFirst()
        .map(ColumnMeta::getProperty)
        .orElse(null);
  }

  public Boolean hasPrimaryKey() {
    return CollUtil.isNotEmpty(getPrimaryKeys());
  }

  public Boolean hasNotPrimaryKey() {
    return !hasPrimaryKey();
  }

  public String getPrimaryKeyType() {
    // 这里默认表中一定会有字段，就不做空判断了
    return columnMetas.stream()
        .filter(ColumnMeta::getPrimaryKey)
        .findFirst()
        .map(ColumnMeta::getPropertySimpleType)
        .orElse(null);
  }

  public void addPrimaryKey(String primaryKey) {
    if (primaryKeys == null) {
      primaryKeys = new LinkedHashSet<>();
    }
    primaryKeys.add(primaryKey);
  }

  public List<ColumnMeta> getColumns() {
    return columnMetas;
  }

  public void setColumns(List<ColumnMeta> columnMetas) {
    this.columnMetas = columnMetas;
  }

  public void addColumn(ColumnMeta columnMeta) {
    // 主键
    if (primaryKeys != null && primaryKeys.contains(columnMeta.getName())) {
      columnMeta.setPrimaryKey(true);
      if (columnMeta.getAutoIncrement() == null
          && (columnMeta.getPropertyType().equals(Integer.class.getName())
              || columnMeta.getPropertyType().equals(BigInteger.class.getName()))) {
        columnMeta.setAutoIncrement(true);
      }
    }

    if (columnMeta.getAutoIncrement() == null) {
      columnMeta.setAutoIncrement(false);
    }

    columnMetas.add(columnMeta);
  }

  @Override
  public String toString() {
    return "Table{"
        + "schema'"
        + schema
        + '\''
        + "name='"
        + name
        + '\''
        + ", remarks='"
        + comment
        + '\''
        + ", primaryKeys='"
        + primaryKeys
        + '\''
        + ", columns="
        + columnMetas
        + '}';
  }
}
